# -*- coding: utf-8 -*-
# @Time  : 2021/8/5 15:21
# @Author: masonsxu
# @File  : datetime_infrastructure.utils.py
# @Desc  : 按照一定格式返回当前时间

from datetime import date, datetime, timedelta
from typing import Tuple, Union


def get_datetime(is_datetime: bool = True) -> Union[datetime, str]:
    """返回当前时间

    Args:
        is_datetime (bool, optional): 是否获取当前时间的 datetime 类型. Defaults to True.

    Returns:
        Union[datetime, str]: 当前时间的字符格式字符串（年-月-日 时:分:秒）;当前时间
    """
    return (
        datetime.now() if is_datetime else datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    )


def get_now_year_month_day() -> Tuple[int, int, int]:
    """返回当前时间的年、月、日

    Returns:
        Tuple[int, int, int]: 当前时间的年、月、日
    """
    # sourcery skip: use-datetime-now-not-today
    now_datetime = datetime.today()
    return now_datetime.year, now_datetime.month, now_datetime.day


def get_maturity_days(year: int, month: int, day: int) -> int:
    """计算当前医院的系统到期时间

    Key:
        year (int): 系统到期时间(年)
        month (int): 系统到期时间(月)
        day (int): 系统到期时间(日)

    Returns:
        days (int): 当前时间与规定到期时间的天数差
    """
    now_date = date.today()
    maturity_date = date(year=year, month=month, day=day)
    return (maturity_date - now_date).days


def str_to_datetime(datetime_str: str, seconds_precision: bool = True) -> datetime:
    """将日期时间字符串转为日期时间类型

    Args:
        datetime_str (str): 日期时间字符串

    Returns:
        datetime: 日期时间类型的日期时间
    """
    if seconds_precision:
        return datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    year, month, day = map(int, datetime_str.split("-"))
    return datetime(year, month, day)


def datetime_to_str(datetime_t):
    """时间戳转字符串
    Args:
        datetime_t:

    Returns:
        datetime_str (str): 时间格式字符串
    """
    return datetime_t.strftime("%Y-%m-%d %H:%M:%S")


def get_now_str():
    """获取当前时间字符串
    Returns:

    """
    return datetime.now().strftime('%Y-%m-%d %H:%M:%S')


def get_today_zero_datetime():
    """获取今天的零点时间

    Returns:
        Zero datetime: 今天零点
    """
    now = datetime.now()
    # 获取今天零点
    return now - timedelta(
        hours=now.hour,
        minutes=now.minute,
        seconds=now.second,
        microseconds=now.microsecond,
    )
